# 对应的项目目录结构如下
# - include/
#     - *.h
# - src/
#     - *.c
# - obj/
#     - *.o
# - TARGET(main)
# - Makefile

# 分别为头文件路径, 源文件路径, 目标文件路径
INCLUDE_DIR := ./include
SRC_DIR := ./src
OBJ_DIR := ./obj
# TARGET即最终可执行文件
TARGET := main
SRCS := $(wildcard $(SRC_DIR)/*.c)
OBJS := $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS))
# CC:指定C编译器 CFLAGS:C编译器选项
CC := gcc
CFLAGS := -Wall -g
# 最终目标
all: $(TARGET)
# $^ 表示第一个依赖文件
# $@ 表示此规则目标文件
# $< 表示所有依赖文件
$(TARGET):$(OBJS)
	$(CC) $(CFLAGS) $^ -o $@

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c 
	$(CC) $(CFLAGS) -I$(INCLUDE_DIR) -c $< -o $@
# 伪目标 clean rebuild
.PHONY: clean rebuild
# $(RM) 即 rm -f
clean:
	$(RM) $(TARGET) $(OBJS)
rebuild: clean all